package com.jdk.thread.lock2;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

/**
 * @Description :
 * @FileName: ThreadTest1.java
 * @Author :WeiHui.Zhang
 * @Data : 2016年2月1日 下午2:55:00
 * @Version:V1.00
 */
public class ThreadTest1 extends Thread {

	private int threadNo;

	public ThreadTest1(int threadNo) {
		this.threadNo = threadNo;
	}

	@Override
	public synchronized void run() {
		try {
			FileOutputStream fileOutputStream = new FileOutputStream("C:/" + threadNo + ".txt");
			for (int i = 1; i < 10000; i++) {
				String data = Thread.currentThread().getName() + "-No." + threadNo + ":" + i;
				PrintStream out0 = new PrintStream(fileOutputStream);
				System.setOut(out0);
				System.out.println(data);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @Name: main
	 * @Description: 这个程序其实就是让10个线程在控制台上数数，从1数到9999。理想情况下，我们希望看到一个线程数完，
	 *               然后才是另一个线程开始数数。但是这个程序的执行过程告诉我们，这些线程还是乱糟糟的在那里抢着报数，丝毫没有任何规矩可言。
	 *               但是细心的读者注意到：run方法还是加了一个synchronized关键字的，按道理说，
	 *               这些线程应该可以一个接一个的执行这个run方法才对阿。
	 *               但是通过上一篇中，我们提到的，对于一个成员方法加synchronized关键字，
	 *               这实际上是以这个成员方法所在的对象本身作为对象锁。在本例中，就是
	 *               以ThreadTest类的一个具体对象，也就是该线程自身作为对象锁的。一共十个线程，每个线程持有自己
	 *               线程对象的那个对象锁。这必然不能产生同步的效果。换句话说，如果要对这些线程进行同步，
	 *               那么这些线程所持有的对象锁应当是共享且唯一的！
	 * @Author: WeiHui.Zhang
	 * @Version: V1.00
	 * @Date: 2016年2月1日下午3:03:30
	 * @param args
	 * @throws InterruptedException
	 * @Return: void
	 */
	public static void main(String[] args) throws InterruptedException {
		for (int i = 0; i < 10; i++) {
			new ThreadTest1(i).start();
			Thread.sleep(1);
		}
	}
}
